package e2e

import (
	"reflect"
	"strings"
	"testing"
)

// RunCase 运行结构体实例的所有以Case开头的方法
func RunCase(t *testing.T, ctx any, files ...string) {
	value := reflect.ValueOf(ctx)
	ctxType := reflect.TypeOf(ctx)

	beforeAll := value.MethodByName("BeforeAll")
	if beforeAll.IsValid() {
		beforeAll.Call(nil)
	}

	afterAll := value.MethodByName("AfterAll")
	if afterAll.IsValid() {
		defer afterAll.Call(nil)
	}

	for i := 0; i < ctxType.NumMethod(); i++ {
		method := ctxType.Method(i)
		if strings.HasPrefix(method.Name, "Case") {
			result := value.MethodByName(method.Name).Call(nil)
			t.Run(result[0].String(), result[1].Interface().(func(*testing.T)))
		}
	}
}

// NewDescribe 创建一个测试分组
func NewDescribe(tag string, ctx any) (string, func(*testing.T)) {
	return tag, func(t *testing.T) {
		RunCase(t, ctx)
	}
}
